home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 4 / FM Towns Free Software Collection 4 - Disc 1.iso / t_os / bricon / source / vdb.c < prev   
Text File  |  1991-10-18  |  18KB  |  875 lines

  1. #define TRUE    1
  2. #define FALSE   0
  3. #define ERR     (-1)
  4.  
  5. /*
  6. #define    ANKCG    1
  7. */
  8.  
  9. #define UCHAR   unsigned char
  10. #define SHORT   short int
  11. #define    UNSIG    unsigned int
  12.  
  13. #define    OFFSET(p,n)    *((unsigned int *)(&(p)))=n
  14. #define    SEGSET(p,n)    *((unsigned int *)(&(p))+1)=n
  15.  
  16. #define    U_AX    (reg->x.ax)
  17. #define U_AH    (reg->h.ah)
  18. #define    U_AL    (reg->h.al)
  19.  
  20. #define    U_BX    (reg->x.bx)
  21. #define U_BH    (reg->h.bh)
  22. #define    U_BL    (reg->h.bl)
  23.  
  24. #define    U_CX    (reg->x.cx)
  25. #define U_CH    (reg->h.ch)
  26. #define    U_CL    (reg->h.cl)
  27.  
  28. #define    U_DX    (reg->x.dx)
  29. #define U_DH    (reg->h.dh)
  30. #define    U_DL    (reg->h.dl)
  31.  
  32. #define    U_DI    (reg->x.di)
  33. #define    U_SI    (reg->x.si)
  34.  
  35. #define    U_DS    (reg->x.ds)
  36. #define    U_ES    (reg->x.es)
  37.  
  38. #define    U_CF    (reg->x.cf)
  39.  
  40. #define    CVRAM    0xC800
  41. #define    KVRAM    0xCA00
  42.  
  43. #define    SCR_X    80
  44. #define MAX_X   80
  45. #ifdef    LINE40
  46.   #define MAX_Y   40
  47. #else
  48.   #define MAX_Y   25
  49. #endif
  50.  
  51. #define DMYKAN  0xFE
  52. #define CRCHR   0x1F
  53. #define TABCHR  0x09
  54. #define    NULCHR    0x20
  55. #define TAB     8
  56. #define CONTRL  FALSE
  57. #define DEFCOL  COLOR
  58.  
  59. SHORT     OLD_X=0xFFFF;
  60. SHORT    CUR_X=0,CUR_Y=0;
  61. SHORT    CUR_TYPE=0x30;
  62. SHORT    CUR_OFF2=14,CUR_SIZE2=2;
  63. UCHAR    CUR_DSP_FLG=0;
  64. UCHAR    Con_mode=0xCE;
  65. SHORT    SCR_Y=MAX_Y;
  66. SHORT    COLOR=7,BAKCOL=0;
  67. UCHAR    Act_Dsp=FALSE;
  68. #ifdef    ANKCG
  69. UCHAR    Ank_font[256][16];
  70. #endif
  71.  
  72. union _REGSET {
  73.     struct {
  74.     SHORT    es;
  75.     SHORT    ds;
  76.     SHORT    di;
  77.     SHORT    si;
  78.     SHORT    bp;
  79.     SHORT    sp;
  80.     SHORT    bx;
  81.     SHORT    dx;
  82.     SHORT    cx;
  83.     SHORT    ax;
  84.     SHORT    ip;
  85.     SHORT    cs;
  86.     SHORT    cf;
  87.     } x;
  88.     struct {
  89.     SHORT    _es;
  90.     SHORT    _ds;
  91.     SHORT    _di;
  92.     SHORT    _si;
  93.     SHORT    _bp;
  94.     SHORT    _sp;
  95.     UCHAR    bl,bh;
  96.     UCHAR    dl,dh;
  97.     UCHAR    cl,ch;
  98.     UCHAR    al,ah;
  99.     SHORT    _ip;
  100.     SHORT    _cs;
  101.     SHORT    _cf;
  102.     } h;
  103. };
  104. /**************************************************************
  105.  
  106.     CONSOL BIOS (int 91h) 
  107.  
  108. ***************************************************************/
  109. void    VDB_00(reg)    /* 初期化 */
  110. register union _REGSET far *reg;
  111. {
  112. #ifdef    ANKCG
  113.     font_init(Ank_font);
  114. #endif
  115.     SCR_Y = MAX_Y - 1;
  116.     CUR_DSP_FLG = 0;
  117.     Con_mode = 0xCE;
  118.     CUR_X = CUR_Y = 0;
  119.     COLOR = 7;
  120.     colset(0,COLOR,(MAX_X * 2) * MAX_Y);
  121.     Con_init();
  122. }
  123. void    VDB_01(reg)
  124. register union _REGSET far *reg;
  125. {
  126. }    /* 画面の表示制御 */
  127.  
  128. void    VDB_02(reg)    /* 全画面消去 */
  129. register union _REGSET far *reg;
  130. {
  131.     colset(0,DEFCOL,(MAX_X * 2) * MAX_Y);
  132.     CUR_X = CUR_Y = 0;
  133. }
  134. void     VDB_03(reg)    /* 表示画面サイズの設定 */
  135. register union _REGSET far *reg;
  136. {
  137.     if ( (SCR_Y = U_DH) > MAX_Y )
  138.     SCR_Y = MAX_Y;
  139.     if ( (Con_mode & 0x40) != 0 )
  140.     SCR_Y--;
  141. }
  142. void     VDB_04(reg)    /* 表示画面サイズの読み取り */
  143. register union _REGSET far *reg;
  144. {
  145.     U_DL = SCR_X;
  146.     U_DH = SCR_Y;
  147. }
  148. void    VDB_05(reg)    /* 表示画面サイズレパ-トリの読み取り */
  149. register union _REGSET far *reg;
  150. {
  151.     union {
  152.     UCHAR far    *p;
  153.     unsigned short  s[2];
  154.     } ptr;
  155.  
  156.     ptr.s[0] = U_DI;
  157.     ptr.s[1] = U_DS;
  158.  
  159.     if ( *(ptr.p++) < 4 )
  160.     return;
  161.     *(ptr.p++) = 1;
  162.     *(ptr.p++) = 80;
  163.     *(ptr.p++) = 25;
  164. }
  165. void     VDB_06(reg)    /* アトリビュート機能範囲の読み取り */
  166. register union _REGSET far *reg;
  167. {
  168.     union {
  169.     UCHAR far    *p;
  170.     unsigned short  s[2];
  171.     } ptr;
  172.  
  173.     ptr.s[0] = U_DI;
  174.     ptr.s[1] = U_DS;
  175.  
  176.     *(ptr.p++) = 0x03;    /* 漢字識別可能 */
  177.     *(ptr.p++) = 0x38;    /* リバ-ス & 強調 */
  178.     *(ptr.p++) = 0x07;    /* 最大色数 */
  179.     *(ptr.p) = 0;
  180. }
  181. void    VDB_07(reg)    /* フォントパタ-ンの取り出し */
  182. register union _REGSET far *reg;
  183. {
  184.     int     i;
  185.     union {
  186.     UCHAR far    *p;
  187.     unsigned short  s[2];
  188.     } ptr,fnt;
  189.  
  190.     ptr.s[0] = U_DI;
  191.     ptr.s[1] = U_DS;
  192.  
  193.     if ( U_BH == 0 ) {    /* ANK 8x8 or 8x16 */
  194.     if ( U_DH != 8 )
  195.         goto ERROR;
  196.     else if ( U_DL == 8 ) {
  197.         fnt.s[0] = U_BL * 8;
  198.         fnt.s[1] = 0xCA00;
  199.         outp(0xFF99,1);
  200.         for ( i = 0 ; i < 8 ; i++ )
  201.         *(ptr.p++) = *(fnt.p++);
  202.         outp(0xFF99,0);
  203.         return;
  204.     } else if ( U_DL == 16 ) {
  205.         fnt.s[0] = U_BL * 16;
  206.         fnt.s[1] = 0xCB00;
  207.         outp(0xFF99,1);
  208.         for ( i = 0 ; i < 16 ; i++ )
  209.         *(ptr.p++) = *(fnt.p++);
  210.         outp(0xFF99,0);
  211.         return;
  212.     } else
  213.         goto ERROR;
  214.     } else if ( U_DX == 0x1010 ) {    /* Kanji 16x16 */
  215.         outp(0xFF94,U_BL);
  216.         outp(0xFF95,U_BH);
  217.     for ( i = 0 ; i < 16 ; i++ ) {
  218.         *(ptr.p++) = inp(0xFF96);
  219.         *(ptr.p++) = inp(0xFF97);
  220.     }
  221.     return;
  222.     }
  223. ERROR:
  224.     U_AH = 0x02;
  225.     U_CF |= 0x0001;
  226. }
  227. void    VDB_08(reg)
  228. register union _REGSET far *reg;
  229. {}    /* 外字パタ-ンの登録 */
  230.  
  231. void    VDB_09(reg)    /* カ-ソル形状の設定 */
  232. register union _REGSET far *reg;
  233. {
  234.     switch(U_AL & 0x0F) {
  235.     case 0: CUR_OFF2 = 14; CUR_SIZE2 = 2; break;
  236.     case 1: CUR_OFF2 = 0;  CUR_SIZE2 = 16; break;
  237.     case 15: CUR_OFF2 = U_DH;
  238.          CUR_SIZE2 = U_DL - CUR_OFF2;
  239.         if ( CUR_OFF2 < 0 || CUR_OFF2 > 15 )
  240.             CUR_OFF2 = 15;
  241.         if ( CUR_SIZE2 < 0 || (CUR_SIZE2 + CUR_OFF2) > 16 )
  242.             CUR_SIZE2 = 16 - CUR_OFF2;
  243.         break;
  244.     }
  245.     CUR_DSP_FLG = ((U_AL & 0x60) == 0x20 ? 1:0);
  246.     CUR_TYPE = U_AL;
  247.     OLD_X = 0xFFFF;
  248. }
  249. void    VDB_0A(reg)    /* カ-ソル形状の読み取り */
  250. register union _REGSET far *reg;
  251. {
  252.     U_AL = CUR_TYPE;
  253.     U_DH = CUR_OFF2;
  254.     U_DL = CUR_OFF2 + CUR_SIZE2;
  255. }
  256. void    VDB_0B(reg)    /* カ-ソル表示状態の設定 */ 
  257. register union _REGSET far *reg;
  258. {
  259.     CUR_DSP_FLG = U_AL;
  260. }
  261. void    VDB_0C(reg)    /* カ-ソル表示状態の読み取り */
  262. register union _REGSET far *reg;
  263. {
  264.     U_AL = CUR_DSP_FLG;
  265. }
  266. void    VDB_0D(reg)    /* カーソル位置の指定 */
  267. register union _REGSET far *reg;
  268. {
  269.     CUR_X = U_DL - 1;
  270.     CUR_Y = U_DH - 1;
  271.     if ( CUR_X < 0 ) CUR_X = 0;
  272.     if ( CUR_X >= SCR_X ) CUR_X = SCR_X - 1;
  273.     if ( CUR_Y < 0 ) CUR_Y = 0;
  274.     if ( CUR_Y >= MAX_Y ) CUR_Y = MAX_Y - 1;
  275. }
  276. void     VDB_0E(reg)    /* カーソル位置の読み取り */
  277. register union _REGSET far *reg;
  278. {
  279.     U_DL = CUR_X + 1;
  280.     U_DH = CUR_Y + 1;
  281. }
  282. void    VDB_0F(reg)    /* アトリビュートの設定 */
  283. register union _REGSET far *reg;
  284. {
  285.     int    at,x,y;
  286.     union {
  287.     UCHAR far    *p;
  288.     unsigned short  s[2];
  289.     } ptr,vrm;
  290.  
  291.     x = U_DL - 1;
  292.     y = U_DH - 1;
  293.  
  294.     vrm.s[1] = CVRAM;
  295.     vrm.s[0] = (x * 2 + (MAX_X * 2) * y + 1);
  296.  
  297.     ptr.s[1] = U_DS;
  298.     ptr.s[0] = (U_DI + 1);
  299.     at = *vrm.p & 0xC0;
  300.     *vrm.p = at | (*ptr.p & 0x38) | (*(ptr.p+1) & 0x07);
  301. }
  302. void    VDB_10(reg)    /* アトリビュートの読み取り */
  303. register union _REGSET far *reg;
  304. {
  305.     int    at,x,y;
  306.     union {
  307.     UCHAR far    *p;
  308.     unsigned short  s[2];
  309.     } ptr,vrm;
  310.  
  311.     x = U_DL - 1;
  312.     y = U_DH - 1;
  313.  
  314.     vrm.s[1] = CVRAM;
  315.     vrm.s[0] = (x * 2 + (MAX_X * 2) * y + 1);
  316.     ptr.s[1] = U_DS;
  317.     ptr.s[0] = U_DI;
  318.  
  319.     if ( (*vrm.p & 0x40) != 0 )
  320.     *ptr.p = 0x01;
  321.     else if ( x > 0 && (*(vrm.p-2) & 0x40) != 0 ) {
  322.     *ptr.p = 0x03;
  323.     vrm.p -= 2;
  324.     } else
  325.     *ptr.p = 0x00;
  326.  
  327.     *(++ptr.p) = *vrm.p & 0x38;
  328.     *(++ptr.p) = *vrm.p & 0x07;
  329. }
  330. void    VDB_11(reg)    /* デフォルトアトリビュ-トの設定 */
  331. register union _REGSET far *reg;
  332. {
  333.     union {
  334.     UCHAR far    *p;
  335.     unsigned short  s[2];
  336.     } ptr;
  337.  
  338.     ptr.s[0] = U_DI;
  339.     ptr.s[1] = U_DS;
  340.  
  341.     DEFCOL = (*(++ptr.p) & 0x38);
  342.     DEFCOL |= (*(++ptr.p) & 0x07);
  343. }
  344. void    VDB_12(reg)    /* デフォルトアトリビュ-トの読み取り */
  345. register union _REGSET far *reg;
  346. {
  347.     union {
  348.     UCHAR far    *p;
  349.     unsigned short  s[2];
  350.     } ptr;
  351.  
  352.     ptr.s[0] = U_DI;
  353.     ptr.s[1] = U_DS;
  354.  
  355.     *(++ptr.p) = DEFCOL & 0x38;
  356.     *(++ptr.p) = DEFCOL & 0x07;
  357. }
  358. void    VDB_13(reg)    /* 文字設定 */
  359. register union _REGSET far *reg;
  360. {
  361.     int    ch,x,y;
  362.     union {
  363.     UCHAR far    *p;
  364.     unsigned short  s[2];
  365.     } ptr;
  366.  
  367.     x = U_DL - 1;
  368.     y = U_DH - 1;
  369.     ch = U_BL;
  370.  
  371.     ptr.s[0] = (x * 2 + (MAX_X * 2) * y);
  372.     ptr.s[1] = CVRAM;
  373.  
  374.     *(ptr.p++) = ch;
  375.     if ( U_AL != 1 )
  376.     *ptr.p = DEFCOL;
  377.     else
  378.     *ptr.p &= 0x3F;
  379.     if ( U_BH == 0x01 )
  380.     *ptr.p |= 0x40;
  381.     else if ( U_BH == 0x03 ) {
  382.     ch |= (*(ptr.p-3) << 8);
  383.     *(ptr.p-1) = *(ptr.p-3) = DMYKAN;
  384.         ptr.s[1] = KVRAM;
  385.     *(ptr.p-3) = ch >> 8;
  386.     *(ptr.p-2) = ch;
  387.     }
  388. }
  389. void    VDB_14(reg)    /* 文字読み取り */
  390. register union _REGSET far *reg;
  391. {
  392.     int    at,x,y;
  393.     union {
  394.     UCHAR far    *p;
  395.     unsigned short  s[2];
  396.     } ptr;
  397.  
  398.     x = U_DL - 1;
  399.     y = U_DH - 1;
  400.  
  401.     ptr.s[1] = CVRAM;
  402.     ptr.s[0] = (x * 2 + (MAX_X * 2) * y);
  403.  
  404.     if ( (*(ptr.p+1) & 0x40) != 0 ) {
  405.     U_BH = 0x01;
  406.         ptr.s[1] = KVRAM;
  407.         U_BL = *ptr.p;
  408.  
  409.     } else if ( x > 0 && (*(ptr.p-1) & 0x40) != 0 ) {
  410.     U_BH = 0x03;
  411.         ptr.s[1] = KVRAM;
  412.         U_BL = *(ptr.p-1);
  413.  
  414.     } else {
  415.     U_BH = 0x00;
  416.         U_BL = *ptr.p;
  417.     }
  418. }
  419. void    VDB_15(reg)    /* 矩形域設定 */
  420. register union _REGSET far *reg;
  421. {
  422.     int     cx,ch;
  423.     int     x1,y1,x2,y2;
  424.     int     x,y,sx,sy;
  425.     union {
  426.     UNSIG far    *p;
  427.     unsigned short  s[2];
  428.     } pp;
  429.     union {
  430.     UCHAR far    *p;
  431.     unsigned short  s[2];
  432.     } cp,ap,sp,vp;
  433.  
  434.     if ( (x1 = U_DL - 1) >= MAX_X || x1 < 0)
  435.     goto ERROR;
  436.     if ( (y1 = U_DH - 1) >= SCR_Y || y1 < 0 )
  437.     goto ERROR;
  438.     if ( (x2 = U_BL) > MAX_X )
  439.     goto ERROR;
  440.     if ( (y2 = U_BH) > SCR_Y )
  441.     goto ERROR;
  442.     sx = x2 - x1; sy = y2 - y1;
  443.     if ( sx <= 0 || sy <= 0 )
  444.     goto ERROR;
  445.  
  446.     sp.s[0] = (x1 * 2 + (MAX_X * 2) * y1);
  447.     sp.s[1] = CVRAM;
  448.  
  449.     pp.s[0] = U_DI;
  450.     pp.s[1] = U_DS;
  451.  
  452.     cp.s[0] = *(pp.p++);
  453.     cp.s[1] = *(pp.p++);
  454.  
  455.     ap.s[0] = *(pp.p++);
  456.     ap.s[1] = *(pp.p++);
  457.  
  458.     for ( y = 0 ; y < sy ; y++ ) {
  459.     for ( x = 0,vp.p = sp.p ; x < sx ; x++ ) {
  460.         *(vp.p++) = *(cp.p++);
  461.         if ( *(ap.p++) == 0x03 ) {
  462.         *(vp.p-2) |= 0x40;
  463.         ch = *(vp.p-3) << 8 | *(vp.p-1);
  464.         vp.s[1] = KVRAM;
  465.         *(vp.p-3) = ch >> 8;
  466.         *(vp.p-2) = ch;
  467.         vp.s[1] = CVRAM;
  468.         } else
  469.         *vp.p &= 0x3F;
  470.         if ( U_AL == 1 ) {
  471.         *vp.p = *(ap.p++) & 0x38;
  472.         *vp.p |= *(ap.p++) & 0x07;
  473.         ap.p++;
  474.         }
  475.         vp.p++;
  476.     }
  477.     sp.p += (MAX_X * 2);
  478.     }
  479.     return;
  480. ERROR:
  481.     U_AH = 0x02;
  482.     U_CF |= 0x0001;
  483. }
  484. void    VDB_16(reg)        /* 矩形域読み取り */
  485. register union _REGSET far *reg;
  486. {
  487.     int     i;
  488.     int     x1,y1,x2,y2;
  489.     int     x,y,sx,sy;
  490.     union {
  491.     UNSIG far    *p;
  492.     unsigned short  s[2];
  493.     } pp;
  494.     union {
  495.     UCHAR far    *p;
  496.     unsigned short  s[2];
  497.     } cp,ap,sp,vp;
  498.  
  499.     if ( (x1 = U_DL-1) >= MAX_X || x1 < 0)
  500.     goto ERROR;
  501.     if ( (y1 = U_DH-1) >= SCR_Y || y1 < 0 )
  502.     goto ERROR;
  503.     if ( (x2 = U_BL) > MAX_X )
  504.     goto ERROR;
  505.     if ( (y2 = U_BH) > SCR_Y )
  506.     goto ERROR;
  507.     sx = x2 - x1; sy = y2 - y1;
  508.     if ( sx <= 0 || sy <= 0 )
  509.     goto ERROR;
  510.  
  511.     sp.s[0] = (x1 * 2 + (MAX_X * 2) * y1);
  512.     sp.s[1] = CVRAM;
  513.  
  514.     pp.s[0] = U_DI;
  515.     pp.s[1] = U_DS;
  516.  
  517.     cp.s[0] = *(pp.p++);
  518.     cp.s[1] = *(pp.p++);
  519.  
  520.     ap.s[0] = *(pp.p++);
  521.     ap.s[1] = *(pp.p++);
  522.  
  523.     for ( y = 0 ; y < sy ; y++ ) {
  524.     for ( x = 0,vp.p = sp.p ; x < sx ; x++ ) {
  525.         *(cp.p++) = *(vp.p++);
  526.         if ( (*vp.p & 0x40) != 0 ) {
  527.         *(ap.p++) = 0x01;
  528.         vp.s[1] = KVRAM;
  529.         *(cp.p-1) = *(vp.p-1);
  530.         vp.s[1] = CVRAM;
  531.         } else if ( x > 0 && (*(vp.p-2) & 0x40) != 0 ) {
  532.         *(ap.p++) = 0x03;
  533.         vp.s[1] = KVRAM;
  534.         *(cp.p-1) = *(vp.p-2);
  535.         vp.s[1] = CVRAM;
  536.         } else
  537.         *(ap.p++) = 0x00;
  538.         if ( U_AL == 1 ) {
  539.         *(ap.p++) = *vp.p & 0x38;
  540.         *(ap.p++) = *vp.p & 0x07;
  541.         ap.p++;
  542.         }
  543.         vp.p++;
  544.     }
  545.     sp.p += (MAX_X * 2);
  546.     }
  547.     return;
  548. ERROR:
  549.     U_AH = 0x02;
  550.     U_CF |= 0x0001;
  551. }
  552. void    VDB_17(reg)    /* 矩形域複写 */
  553. register union _REGSET far *reg;
  554. {
  555.     int     i;
  556.     int     x1,y1,x2,y2,x3,y3;
  557.     int     sx,sy;
  558.     UNSIG   sp;
  559.     UNSIG   dp;
  560.  
  561.     if ( (x1 = U_DL - 1) >= MAX_X || x1 < 0 )
  562.     goto ERROR;
  563.     if ( (y1 = U_DH - 1) >= SCR_Y || y1 < 0 )
  564.     goto ERROR;
  565.     if ( (x2 = U_BL) > MAX_X )
  566.     goto ERROR;
  567.     if ( (y2 = U_BH) > SCR_Y )
  568.     goto ERROR;
  569.     if ( (x3 = U_CL - 1) >= MAX_X || x3 < 0 )
  570.     goto ERROR;
  571.     if ( (y3 = U_CH - 1) >= SCR_Y || y3 < 0 )
  572.     goto ERROR;
  573.     sx = x2 - x1; sy = y2 - y1;
  574.     if ( sx <= 0 || sy <= 0 )
  575.     goto ERROR;
  576.     if ( (x3 + sx) > MAX_X || (y3 + sy) > SCR_Y )
  577.     goto ERROR;
  578.  
  579.     if ( sp < dp ) {
  580.     sp = (x2 - 1) * 2 + (MAX_X * 2) * (y2 - 1);
  581.     dp = (x3 + sx - 1) * 2 + (MAX_X * 2) * (y3 + sy - 1);
  582.     for ( i = 0 ; i < sy ; i++ ) {
  583.         vramrcpy(dp,sp,sx * 2);
  584.         sp -= (MAX_X * 2);
  585.         dp -= (MAX_X * 2);
  586.     }
  587.     } else {
  588.     sp = x1 * 2 + (MAX_X * 2) * y1;
  589.     dp = x3 * 2 + (MAX_X * 2) * y3;
  590.     for ( i = 0 ; i < sy ; i++ ) {
  591.         vramcpy(dp,sp,sx * 2);
  592.         sp += (MAX_X * 2);
  593.         dp += (MAX_X * 2);
  594.     }
  595.     }
  596.     return;
  597. ERROR:
  598.     U_AH = 0x02;
  599.     U_CF |= 0x0001;
  600. }
  601. void    VDB_18(reg)    /* 矩形域消去 */
  602. register union _REGSET far *reg;
  603. {
  604.     int     i;
  605.     int     x1,y1,x2,y2;
  606.     int     sx,sy;
  607.     UNSIG   sp;
  608.  
  609.     if ( (x1 = U_DL - 1) >= MAX_X || x1 < 0 )
  610.     goto ERROR;
  611.     if ( (y1 = U_DH - 1) >= SCR_Y || y1 < 0 )
  612.     goto ERROR;
  613.     if ( (x2 = U_BL) > MAX_X )
  614.     goto ERROR;
  615.     if ( (y2 = U_BH) > SCR_Y )
  616.     goto ERROR;
  617.     sx = x2 - x1; sy = y2 - y1;
  618.     if ( sx <= 0 || sy <= 0 )
  619.     goto ERROR;
  620.     sp = (x1 * 2 + (MAX_X * 2) * y1);
  621.  
  622.     for ( i = 0 ; i < sy ; i++ ) {
  623.     colset(sp,DEFCOL,sx * 2);
  624.     sp += (MAX_X * 2);
  625.     }
  626.     return;
  627. ERROR:
  628.     U_AH = 0x02;
  629.     U_CF |= 0x0001;
  630. }
  631. void    VDB_19(reg)    /* 全画面スクロ-ル */ 
  632. register union _REGSET far *reg;
  633. {
  634.     int     cx,i;
  635.     UNSIG   vp;
  636.  
  637.     if ( (cx = U_CX) == 0 || cx > SCR_Y )
  638.     cx = SCR_Y;
  639.     for ( ; cx > 0 ; cx-- ) {
  640.     switch(U_AL) {
  641.         case 1:    /* 下方向 */
  642.         i = (MAX_X * 2) * (SCR_Y - 1);
  643.         vramrcpy(i + (MAX_X * 2 - 2),i - 2,i);
  644.         colset(0,DEFCOL,(MAX_X * 2));
  645.         break;
  646.         case 2:    /* 右方向 */
  647.         i = (MAX_X * 2) * SCR_Y - 2;
  648.         vramrcpy(i,i - 2,i);
  649.         vp = 0;
  650.         for ( i = 0 ; i < SCR_Y ; i++ ) {
  651.             colset(vp,DEFCOL,2);
  652.             vp += (MAX_X * 2);
  653.         }
  654.         break;
  655.         case 3:    /* 左方向 */
  656.         vramcpy(0,2,(MAX_X * 2) * SCR_Y - 2);
  657.         vp = (MAX_X * 2) - 2;
  658.         for ( i = 0 ; i < SCR_Y ; i++ ) {
  659.             colset(vp,DEFCOL,2);
  660.             vp += (MAX_X * 2);
  661.         }
  662.         break;
  663.             default:     /* case 0 上方向 */
  664.         vramcpy(0,(MAX_X * 2),(MAX_X * 2) * (SCR_Y - 1));
  665.         colset((MAX_X * 2) * (SCR_Y - 1),DEFCOL,(MAX_X * 2));
  666.         break;
  667.     }
  668.     }
  669. }
  670. void    VDB_1A(reg)    /* 部分スクロ-ル */
  671. register union _REGSET far *reg;
  672. {
  673.     int     cx,i;
  674.     int     x1,y1,x2,y2;
  675.     int     sx,sy;
  676.     UNSIG   sp;
  677.     UNSIG   vp;
  678.  
  679.     if ( (x1 = U_DL - 1) >= MAX_X || x1 < 0 )
  680.     goto ERROR;
  681.     if ( (y1 = U_DH - 1) >= SCR_Y || y1 < 0 )
  682.     goto ERROR;
  683.     if ( (x2 = U_BL) > MAX_X )
  684.     goto ERROR;
  685.     if ( (y2 = U_BH) > SCR_Y )
  686.     goto ERROR;
  687.     sx = x2 - x1; sy = y2 - y1;
  688.     if ( sx <= 0 || sy <= 0 )
  689.     goto ERROR;
  690.     sp = (x1 * 2 + (MAX_X * 2) * y1);
  691.  
  692.     if ( (cx = U_CX) == 0 || cx > sy )
  693.     cx = sy;
  694.     for ( ; cx > 0 ; cx-- ) {
  695.     switch(U_AL) {
  696.         case 1:    /* 下方向 */
  697.         vp = sp + (MAX_X * 2) * (sy - 1);
  698.         for ( i = 0 ; i < (sy-1) ; i++ ) {
  699.             vramcpy(vp,vp - (MAX_X * 2),sx * 2);
  700.             vp -= (MAX_X * 2);
  701.         }
  702.         colset(sp,DEFCOL,sx * 2);
  703.         break;
  704.         case 2:    /* 右方向 */
  705.         vp = sp + (sx * 2) - 2;
  706.         for ( i = 0 ; i < sy ; i++ ) {
  707.             vramrcpy(vp,vp - 2,sx * 2 - 2);
  708.             vp += (MAX_X * 2);
  709.         }
  710.         vp = sp;
  711.         for ( i = 0 ; i < sy ; i++ ) {
  712.             colset(vp,DEFCOL,2);
  713.             vp += (MAX_X * 2);
  714.         }
  715.         break;
  716.         case 3:    /* 左方向 */
  717.         vp = sp;
  718.         for ( i = 0 ; i < sy ; i++ ) {
  719.             vramcpy(vp,vp + 2,sx * 2 - 2);
  720.             vp += (MAX_X * 2);
  721.         }
  722.         vp = sp + (sx * 2) - 2;
  723.         for ( i = 0 ; i < sy ; i++ ) {
  724.             colset(vp,DEFCOL,2);
  725.             vp += (MAX_X * 2);
  726.         }
  727.         break;
  728.             default:     /* case 0 上方向 */
  729.         for ( vp = sp,i = 0 ; i < (sy-1) ; i++ ) {
  730.             vramcpy(vp,vp + (MAX_X * 2),sx * 2);
  731.             vp += (MAX_X * 2);
  732.         }
  733.         colset(vp,DEFCOL,sx * 2);
  734.         break;
  735.     }
  736.     }
  737.     return;
  738. ERROR:
  739.     U_AH = 0x02;
  740.     U_CF |= 0x0001;
  741. }
  742. void    VDB_1B(reg)    /* コンソ-ル機能の設定 */
  743. register union _REGSET far *reg;
  744. {
  745.     int     i;
  746.  
  747.     i = Con_mode;
  748.     Con_mode = (U_AL & 0xC7) | 0x08;
  749.     if ( (i & 0x40) != (Con_mode & 0x40) ) {
  750.     if ( (Con_mode & 0x40) != 0 )
  751.         SCR_Y--;
  752.     else
  753.         SCR_Y++;
  754.     }
  755. }
  756. void    VDB_1C(reg)    /* コンソ-ル機能の読み取り */
  757. register union _REGSET far *reg;
  758. {
  759.     U_AL = Con_mode;
  760. }
  761. void    VDB_1D(reg)    /* 文字の出力 */
  762. register union _REGSET far *reg;
  763. {
  764.     Chr_out(U_AL);
  765. }
  766. void    VDB_1E(reg)    /* 文字列の出力 */
  767. register union _REGSET far *reg;
  768. {
  769.     int     i;
  770.     union {
  771.     UCHAR far    *p;
  772.     unsigned short  s[2];
  773.     } ptr;
  774.  
  775.     ptr.s[0] = U_DI;
  776.     ptr.s[1] = U_DS;
  777.  
  778.     for ( i = U_CX ; i > 0 ; i-- )
  779.     Chr_out(*(ptr.p++));
  780. }
  781. void    VDB_1F(reg)    /* システム行書き込み */
  782. register union _REGSET far *reg;
  783. {
  784.     int    ch,cx,at,md;
  785.     union {
  786.     UNSIG far    *p;
  787.     unsigned short  s[2];
  788.     } pp;
  789.     union {
  790.     UCHAR far    *p;
  791.     unsigned short  s[2];
  792.     } cp,vp,ap;
  793.  
  794.     if ( (Con_mode & 0x40) == 0 )
  795.     return;
  796.  
  797.     pp.s[0] = U_DI;
  798.     pp.s[1] = U_DS;
  799.  
  800.     cp.s[0] = *(pp.p++);
  801.     cp.s[1] = *(pp.p++);
  802.  
  803.     ap.s[0] = *(pp.p++);
  804.     ap.s[1] = *(pp.p++);
  805.  
  806.     vp.s[0] = ((U_DL & 0x7F) - 1) * 2 + (MAX_X * 2) * SCR_Y;
  807.     vp.s[1] = CVRAM;
  808.  
  809.     cx = U_CX;
  810.     for ( ; cx > 0 ; cx-- ) {
  811.     *(vp.p++) = *(cp.p++);
  812.     if ( U_AL != 1 ) {
  813.         at = DEFCOL;
  814.         md = *(ap.p++);
  815.     } else {
  816.         md = *(ap.p++);
  817.         at = *(ap.p++) & 0x38;
  818.         at |= (*(ap.p++) & 0x07); ap.p++;
  819.     }
  820.     *(vp.p++) = at;
  821.     if ( md == 0x03 ) {
  822.         ch = (*(vp.p-4) << 8) | *(vp.p-2);
  823.         *(vp.p-4) = *(vp.p-2) = DMYKAN;
  824.         *(vp.p-3) |= 0x40;
  825.         vp.s[1] = KVRAM;
  826.         *(vp.p-4) = ch >> 8;
  827.         *(vp.p-3) = ch;
  828.         vp.s[1] = CVRAM;
  829.     }
  830.     }
  831. }
  832. void    VDB_20(reg)    /* 背景色の読み取り */
  833. register union _REGSET far *reg;
  834. {
  835.     U_DX = BAKCOL;
  836. }
  837. void    VDB_21(reg)
  838. register union _REGSET far *reg;
  839. {
  840. #ifdef    ANKCG
  841.     int       i;
  842.     UCHAR     *p;
  843.     UCHAR far *s;
  844.  
  845.     SEGSET(s,U_DS);
  846.     OFFSET(s,U_DI);
  847.     p = Ank_font[U_DL];
  848.     for ( i = U_CX ; i > 0 ; i-- )
  849.     *(p++) = *(s++);
  850. #endif
  851. }
  852.  
  853. void    BIOS_91(reg)
  854. register union _REGSET far *reg;
  855. {
  856.     int     cmd;
  857.     static void (*VDB_table[])()={
  858.     VDB_00,    VDB_01,    VDB_02,    VDB_03,    VDB_04,    VDB_05,    VDB_06,    VDB_07,
  859.     VDB_08,    VDB_09,    VDB_0A,    VDB_0B,    VDB_0C,    VDB_0D,    VDB_0E,    VDB_0F,
  860.     VDB_10,    VDB_11,    VDB_12,    VDB_13,    VDB_14,    VDB_15,    VDB_16,    VDB_17,
  861.     VDB_18,    VDB_19,    VDB_1A,    VDB_1B,    VDB_1C,    VDB_1D,    VDB_1E,    VDB_1F,
  862.     VDB_20, VDB_21 };
  863.  
  864. /*    Act_Dsp = TRUE;    */
  865.     if ( (cmd = U_AH) <= 0x21 ) {
  866.     U_AH = 0;
  867.     U_CF &= 0xFFFE;
  868.     (*VDB_table[cmd])(reg);
  869.     } else {
  870.         U_AH = 0x01;
  871.         U_CF |= 0x0001;
  872.     }
  873. /*    Act_Dsp = FALSE; */
  874. }
  875.